// app:application 应用程序
// 为了结构清晰,我们约定把所有的HTML文件都放到views(视图)中
// 为了方便统一管理处理静态资源,我们约定把所有的静态资源都放在public目录中
// 那些资源能被用户访问,那些资源不能被用户访问,我们可以用代码灵活的限制

let http = require('http');
let fs =require('fs');
let template = require('art-template');
let url = require('url'); // 该模块的信息详见09案例

let comments = [
  {
    name: 'Aqing',
    message: 'Node.js is interesting very much!',
    dateTime: '2018-8-20'
  },
  {
    name: 'Aqing',
    message: 'Node.js is interesting very much!',
    dateTime: '2018-8-20'
  },
  {
    name: 'Aqing',
    message: 'Node.js is interesting very much!',
    dateTime: '2018-8-20'
  },
  {
    name: 'Aqing',
    message: 'Node.js is interesting very much!',
    dateTime: '2018-8-20'
  },
  {
    name: 'Aqing',
    message: 'Node.js is interesting very much!',
    dateTime: '2018-8-20'
  },
  {
    name: 'Aqing',
    message: 'Node.js is interesting very much!',
    dateTime: '2018-8-20'
  },
  {
    name: 'Aqing',
    message: 'Node.js is interesting very much!',
    dateTime: '2018-8-20'
  }
];
// 由于表单提交的的请求路径,由于其中具有用户动态填写的内容
// 所以不可能去通过判断完整的url路径来处理这个请求
// 所以我们判断,当请求路径包含 /pinglun 的时候,那我们就认为你提交的表单请求过来了

// 简写,不用一个值去接收返回值,再进行请求绑定,
http
  .createServer(function (req, res) {
    // url.parse方法将路径解析为一个方便操作的对象,第二个参数为true表示将查询字符串转为对象(query属性访问)
    let parseObj = url.parse(req.url, true);
    // 单独获取不包含查询字符串的路径部分(该路径不包含?之后的内容,用它来代替请求的url)
    let pathname = parseObj.pathname;
    // let _url = req.url; // 被pathname代替,它们实际上一个值
    if (pathname === '/') {
      fs.readFile('./views/index.html', function (err, data) {
        if (err) {
          return res.end('404 Not Found');
        }
        let htmlStr = template.render(data.toString(), {
          comments: comments
        });
        res.end(htmlStr);
      })
    } else if (pathname === '/post') {
      fs.readFile('./views/post.html', function (err, data) {
        if (err) {
          return res.end('404 Not Found');
        }
        res.end(data);
      })
    } else if (pathname.indexOf('/public/') === 0) {
      // 统一处理: 如果请求路径是以public开头的,则认为获取的是某个静态资源
      //          所以我们接直接可以吧请求路径当做文件路径来直接获取
      fs.readFile('.' + pathname, function (err, data) {
        if (err) {
          return res.end('404 Not Found');
        }
        res.end(data);
      })
    } else if (pathname === '/pinglun') { // 由于取的请求的url的pathname字段,所以不管请求发送的是什么,只要有该字段,就认为它发送了表单请求
      // 这个时候无卵 /pinglun?xxx是什么,都不需要担心,因为pathname不包含?后的表单内容
      console.log(JSON.stringify(parseObj.query));
      // 我们已经使用url模块的parse方法吧请求路径的查询字符串解析成一个对象
      // 所以接下来要做的就是:
      //    1.获取表单提交数据,
      //    2.生成日期到数据对象中然后存储到数组中,
      //    3.让用户重定向到首页,当用户重新请求/的时候,数据已经发送了变化
      let comment = parseObj.query;
      comment.dateTime = Date().substr(0, 24);
      comments.unshift(comment);
      // 到这一步,服务端就把数据存储好了,接下来就是让用户重新请求 / 首页,就可以看到最新的留言内容了
      // 如何通过服务器让客户端重定向?
      //    1.状态码设置为302代表临时重定向
      //      statusCode
      //    2.在响应头中通过Location告诉客户端往哪重定向
      //      setHeader
      // 如果客户端发现到服务器的响应状态码是302,就会自动去响应头中找Location,然后对该地址发起新的请求
      // 所以你就能看到客户端自动跳转了
      res.statusCode = 302;
      res.setHeader('Location', '/');
      res.end();
    } else {
      // 其他的处理成404页面
      fs.readFile('./views/404.html', function (err, data) {
        if (err) {
          return res.end('404 Not Found');
        }
        res.end(data);
      })
    }
})
  .listen(3000, function () {
    console.log('running');
});
